利用 Github 做图床的一款 Typecho 图床插件 — GithubRepo
为了方便自己的写作需求,又不想将附件上传到免费图床(因为收费的用不起,免费的怕跑路 [emoji:1f973] )或者上传到服务器上占用服务器空间,所以我自研了一款专属于Typecho的Github仓库图床插件,本项目利用Github仓库进行储存,使用第三方代理服务提供图片访问(A Typecho image hosting plugin based on Github)。
GithubRepo 展示
插件设置页

Github图床管理

文章插入按钮

GithubRepo 特点
- 插件支持Typecho自带附件上传功能
- 适配各个主题,或者Typecho自带的编辑器
- 支持自定义 Github多仓库 / 多目录 上传
- 编辑器上传支持 拖拽 / Ctrl+V 粘贴 / 多文件批量,并展示缩略图预览
- 访问速度超快 (你问速度吗?本文图片可全是秒加载)
- 稳定性 (你问这个是怕最大的 ** 网站跑路吗?)
GithubRepo 安装教程
- 下载插件解压到插件目录
- 获取token
- 创建仓库 (不会?别急创建仓库)
- 设置插件
- 用户名填入Github账号
- 填入token
- 储存桶填入仓库名
- 目前教程比较笼统,如果不知道怎么操作的可以评论区留言。
更新历史
- 图床文件列表性能优化:默认改为「当前目录」单层浏览(一次 API 请求),「递归列出全部」结果缓存 5 分钟,单个目录失败只告警跳过不再整页空白
- 新增文件搜索与分页(每页 50 条),目录面包屑导航
- 仓库编辑:仓库管理 Tab 支持编辑已有仓库(分支 / Token / 目录 / 备注 / 默认),避免「删了重建」导致历史附件路径前缀失效
modifyHandle(替换文件)补齐全部校验:抽出validateFile()与新增上传共用(体积上限 / 25MB 硬上限 / 真实 MIME / 内存预检),且不再写本地上传目录- 上传前增加内存余量预检,避免因
memory_limit不足导致大文件 OOM Api重试覆盖 5xx 与 429 限流,并支持响应头Retry-After;状态码获取失败时用响应体message兜底判定,避免 401/403 被当成功- 编辑器上传支持拖拽 / Ctrl+V 粘贴 / 多文件批量,并展示缩略图预览(点击缩略图可切换填入的地址)
- 图片压缩最大宽度可配(新增
ImgCompressMaxWidth,填 0 表示只重编码不缩放) - Token 配置改为密码框,不再明文回显;全局 Username / Repo / Token 标注为「旧版兼容 / 全局默认」,不再强制必填
- 日志保留策略:自动清理 30 天前日志,超大日志只读尾部,避免整文件读入内存
- 移除未使用的
_TMP_PATH死代码;CI 校验矩阵修正为 PHP 8.0 / 8.1 / 8.2 / 8.3 - 整理 README 版本日志,补全 SECURITY.md 安全策略
{/collapse-item}
{collapse-item label="Ver 1.2.0(多仓库/多目录)"} - 支持多仓库:后台「Github图床管理 → 仓库管理」可增删多个 GitHub 仓库,每个仓库可配独立 Token、分支、备注名、默认子目录
- 支持每文件选仓库 + 选目录:编辑器「上传 GitHub」控件新增仓库下拉与目录输入框,上传时指定落点;不指定则走默认仓库
- 「图床文件」Tab 新增仓库下拉切换,按仓库列出文件并删除
- 附件路径带仓库前缀(
仓库ID:路径),之后改默认仓库也不会让历史附件链接错位 - 旧版单仓配置(Username / Repo / Branch)自动作为默认仓库回退,升级无需重新配置
- 新增
do=saveRepo/do=delRepo/do=setDefaultRepo三个管理端点(均带管理员校验 + CSRF) - 日志删除
delLog由 GET 改为 POST + CSRF,防止跨站删除 - 单文件体积上限与 GitHub Contents API 的 25MB 硬上限对齐(配置超过 25 自动钳制,超限本地即拦截)
- 「上传记录」Tab 按关键字过滤,仅展示上传事件
{/collapse-item}
{collapse-item label="Ver 1.1.1"} - 实装「图片压缩」:开启
ImgCompress后上传 jpg/png 经 GD 压缩(新增ImgCompressQuality质量配置) - 新增「图床文件管理」后台面板:递归列出 GitHub 仓库文件并可同步删除(解决独立上传端点无删除入口的问题)
- 新增
MaxFileSize单文件体积上限(MB)配置,超限拒绝上传 - 上传新增真实 MIME 校验(
mime_content_type),拦截扩展名伪装文件 Api.php新增网络异常失败重试(3 次,含退避),并暴露真实 API 错误- 上传 / 删除失败提示透出真实原因;为
githubUpload与delGithubFile增加 CSRF 校验 - 修正过期仓库链接(GithubFile → GithubRepo)
{/collapse-item}
{/collapse-item}
{collapse-item label="Ver 1.1.0"} - 修复 Token 被误配为 ApiMirror,导致所有 API 调用鉴权失败(致命)
- 修复上传/更新/删除路径变量名不一致(
$Gpath/$gpath) - 补齐缺失的
checkFileType()文件类型白名单校验(原调用未定义方法导致上传 fatal) - 修复
attachmentHandle中content['attachment']漏写$的语法错误 - 用
ensureApi()惰性初始化替代失效的__callStatic单例初始化(原机制因方法已定义永不触发) - 修复
deleteHandle引用未定义$gapi的问题 - 修复
delLog路径遍历任意文件删除漏洞,并修复日志面板 XSS - 增强
Api错误处理(异常捕获、HTTP 状态码判断),避免网络失败时误判上传成功 - 重命名为 GithubRepo,适配 Typecho 1.3.0 与 PHP 8.0+
- 修复 Typecho 1.3 下附件钩子
array $content类型声明导致整页 500(TypeError) - 修复返回链接占位符未替换(大小写命名不匹配),新增
buildFileUrl()统一拼 URL - 新增调试日志写入逻辑(开启 DebugLog 后「日志内容」面板有内容)
- 新增独立图床上传端点
do=githubUpload(不经过附件表),返回 JSON URL - 适配 Supreme 主题 SpEdit 编辑器:改造「插入图片」弹窗,新增「上传 GitHub」入口
- 默认镜像改为
gh.dpik.top前缀代理(https://gh.dpik.top/https://raw.githubusercontent.com/...)
{/collapse-item}
{/timeline-item}
{timeline-item color="#ed4014"}
GithubFile 历史版本 - 基于
GithubFile插件 重构插件 - 修复老插件的Bug
{/collapse-item}
{collapse-item label="Ver 1.1及更早(旧版 GithubFile 时代,仅作归档)"}
Ver 1.3.2 - 兼容最新版Typecho 1.2 和 PHP7.4
Ver 1.2 - 更新为Token认证(支持personal token 或者 oauth token)
Ver 1.1
已更新 - 支持了basic认证方式
使用Typecho内置http方式替代
{/collapse-item}
{/timeline-item}安全性须知
插件代码为公开开源,认证过程基于
Token
图片代理源(图片镜像)- 自建代理
- 第三方代理
项目地址
因为本项目在灰度测试当中,不方便发布可以关注本博客,后续我会更新插件进度。
暂无评论